package com.wei.czz.common.po;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.wei.czz.common.constant.Constant;
import com.wei.czz.common.tool.BaseEntity;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-04-27 14:22:11
 * className: ValidateCodeBo 验证码操作记录封装类
 * version: 1.0
 * description:
 *  `@JsonInclude(JsonInclude.Include.NON_NULL)`：接口返回对象时，如果某个字段值为空，序列化不操作该字段
 *
 *  此类作为系统内部使用
 */
@Getter
@Setter
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ValidateCodePo extends BaseEntity {

    /**
     * 操作次数
     * 单ip操作统计
     */
    private Integer count;

    /**
     * 第一次操作时间（时间戳）
     * 单ip操作统计
     */
    private Long firstOptTime;

    /**
     * 验证码主键值
     */
    private Long id;

    /**
     * 账号
     */
    private String account;

    /**
     * 请求ip
     */
    private String requestIp;

    /**
     * 验证码
     */
    private String code;

    /**
     * 验证码失效时间（时间戳）
     * 用户校验通过后，需要将该值置零
     */
    private Long expireTime;

    /**
     * 验证码校验失败次数
     * 用户校验通过后，需要将该值置空
     */
    private Integer auditFailNum;

    public ValidateCodePo() {}

    public ValidateCodePo(Integer count, Long firstOptTime) {
        this.count = count;
        this.firstOptTime = firstOptTime;
    }

    /**
     * 重置统计数据
     * @param startTime 当前系统时间所在自然日的开始时间
     * @param nowTime   当前系统时间戳
     */
    public void resetData(Long startTime, Long nowTime) {
        if (nowTime - firstOptTime > Constant.ONE_DAY_NUM) {
            // 参数时间戳与第一次操作时间戳间隔大于一天
            count = 0;
            firstOptTime = startTime;
        }
    }

    /**
     * 操作次数自增
     */
    public void incrementCount() {
        this.count++;
    }

    /**
     * 校验失败次数自增
     */
    public void incrementAuditFail() {
        this.auditFailNum++;
    }

}
